package com.jay.springboot.starter.annotation;

import com.jay.constant.RpcConstant;
import com.jay.fault.retry.RetryStrategyKeys;
import com.jay.fault.tolerant.TolerantStrategyKeys;
import com.jay.loadbalancer.LoadBalancerKeys;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 服务消费者注解（用于注入服务）
 * 该注解用于在客户端标记需要通过RPC调用的服务接口，通过该注解可以配置服务的各类调用参数
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface RpcReference {

    /**
     * 服务接口类
     * 指定通过RPC调用的服务接口类，这是调用远程服务的依据
     */
    Class<?> interfaceClass() default void.class;

    /**
     * 版本
     * 指定服务的版本，用于在提供者和消费者之间匹配相同版本的服务
     */
    String serviceVersion() default RpcConstant.DEFAULT_SERVICE_VERSION;

    /**
     * 负载均衡器
     * 指定客户端使用的负载均衡策略，如轮询、随机等
     */
    String loadBalancer() default LoadBalancerKeys.ROUND_ROBIN;

    /**
     * 重试策略
     * 指定在调用失败时的重试策略，如不重试、重试特定次数等
     */
    String retryStrategy() default RetryStrategyKeys.NO;

    /**
     * 容错策略
     * 指定在遇到错误时的处理策略，如快速失败、失败重试等
     */
    String tolerantStrategy() default TolerantStrategyKeys.FAIL_FAST;

    /**
     * 模拟调用
     * 表示是否启用模拟调用，主要用于测试或特殊场景下不实际发送远程调用
     */
    boolean mock() default false;

}

